/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Estruturas;

import java.awt.Point;
import java.util.Hashtable;
import java.util.LinkedList;

/**
 *
 * @author linton
 */
public class Pixel {

    protected int nivelCinza; // nivel de cinza do pixel
    protected Point coordenadas; // coordenadas do pixel na matriz
    protected LinkedList<PixelWatershed> vizinhos; // vizinhos do pixel
    protected int chave; // valor correspondente da coordenado em um vetor
    protected Pixel PMB;
    protected int width;

    public Pixel(){

    }

    public Pixel(int nivelCinza, int x, int y, int width) {
        this.nivelCinza = nivelCinza;
        coordenadas = new Point(x, y);
        vizinhos = new LinkedList<PixelWatershed>();
        chave = getPosicaonoVetor(coordenadas, width);
        this.width = width;
    }

    public int getNivelCinza() {
        return nivelCinza;
    }

  //  atualiza a lista de vizinhos do pixel
    public void setarVizinhos(Hashtable<Integer, PixelWatershed> pontosImagem, int width, int height) {
        //System.out.println("");System.out.println("Pixel X:"+ this.getX()+" Y:"+this.getY());
        for (int x = -1; x < 2; x++) {
            for (int y = -1; y < 2; y++) {
               if (coordenadas.x + x >= 0 && coordenadas.y + y >= 0 && coordenadas.x + x < height && coordenadas.y + y < width) {//cantos da imagem
                    int chaveVizinho = getPosicaonoVetor(new Point(coordenadas.x + x, coordenadas.y + y), width);
                    PixelWatershed vizinho = pontosImagem.get(chaveVizinho);

                    if (vizinho.getChave() != this.getChave()) {
                     //   System.out.println("Vizinho X:"+vizinho.getX()+" Y:"+vizinho.getY());
                        vizinhos.add(vizinho);
                    }
                }
            }
        }
    }
    
    //não pega os vizinhos na diagonal
//    public void setarVizinhos(Hashtable<Integer, PixelWatershed> pontosImagem, int width, int height) {
//        //System.out.println("");System.out.println("Pixel X:"+ this.getX()+" Y:"+this.getY());
//        for (int x = -1; x < 2; x++) {
//            for (int y = -1; y < 2; y++) {
//               if(Math.abs(x+y)==1)
//                if (coordenadas.x + x >= 0 && coordenadas.y + y >= 0 && coordenadas.x + x < height && coordenadas.y + y < width) {//cantos da imagem
//                    int chaveVizinho = getPosicaonoVetor(new Point(coordenadas.x + x, coordenadas.y + y), width);
//                    PixelWatershed vizinho = pontosImagem.get(chaveVizinho);
//
//                    if (vizinho.getChave() != this.getChave()) {
//                       // System.out.println("Vizinho X:"+vizinho.getX()+" Y:"+vizinho.getY());
//                        vizinhos.add(vizinho);
//                    }
//                }
//            }
//        }
//    }

    public LinkedList<PixelWatershed> getVizinhos() {
        return vizinhos;
    }



    public int getChave() {
        return chave;
    }

    public Point getCoordenadas() {
        return coordenadas;
    }

    //retorna a posição correspondete do pixel no vetor (como seu valor é unico e utilizado como chave da tabela hash)
    public static int getPosicaonoVetor(Point ponto, int whidth) {

        return (ponto.x + ponto.y + ponto.y * whidth);
    }

    public void imprimeVizinhos() {
        for (int i = 0; i < vizinhos.size(); i++) {
            System.out.println(vizinhos.get(i).getCoordenadas());
        }
    }

    public void setCoordenadas(Point coordenadas) {
        this.coordenadas = coordenadas;
    }

    public void setNivelCinza(int nivelCinza) {
        this.nivelCinza = nivelCinza;
    }

    public Pixel getPMB() {
        return PMB;
    }

    public void setPMB(Pixel PMB) {
        this.PMB = new Pixel((int) PMB.getNivelCinza(), PMB.getCoordenadas().x, PMB.getCoordenadas().y, 0);
    }

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getX(){
        return this.coordenadas.x;
    }

    public int getY(){
        return this.coordenadas.y;
    }
}
